home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / database / ingres04.lzh / source / support / indconv.q < prev    next >
Encoding:
Text File  |  1984-12-31  |  3.4 KB  |  200 lines

  1. # include    <sccs.h>
  2.  
  3. SCCSID(@(#)indconv.q    8.1    12/31/84)
  4.  
  5.  
  6. # define    MAXNAME        12
  7. # define    M_HEAP        5
  8. # define    M_ISAM        11
  9. # define    M_HASH        21
  10.  
  11. ##    char        *Usercode;
  12.     struct
  13.     {
  14.         char    relname[MAXNAME + 1], indname[MAXNAME + 1], relsp[10];
  15.         char    domname[7][MAXNAME + 1], modseq[7];
  16.     }    Indinfo[100];
  17.  
  18. struct relspec
  19. {
  20.     char    specnum, *specname;
  21. };
  22.  
  23. struct relspec    relspecs[]
  24. {
  25.     M_ISAM,        "isam",
  26.     M_HASH,        "hash",
  27.     -M_ISAM,    "cisam",
  28.     -M_HASH,    "chash",
  29.     M_HEAP,        "heap",
  30.     -M_HEAP,    "cheap",
  31.     0
  32. };
  33.  
  34. main(argc, argv)
  35. int    argc;
  36. char    *argv[];
  37. {
  38.     char    *kp;
  39. ##    char    aname[20];
  40. ##    char    keystring[100];
  41. ##    char    pname[20], iname[20];
  42. ##    char    *db;
  43. ##    int    cnt, i, j, rspec, aid, akey;
  44.  
  45.     if (argc != 2)
  46.         syserr(0, "wrong number of parameters");
  47.     db = argv[1];
  48.     if (initucode(db, 0, 0, 0, 0))
  49.         syserr(0, "cannot access %s data base", db);
  50. ##    ingres db "-nheap"
  51.     cnt = 0;
  52. ##    range of r is relation
  53. ##    retrieve (iname = r.relid, rspec = r.relspec)
  54. ##        where r.relindxd < 0 and r.relindxd != -2 and r.relowner = Usercode
  55. ##    {
  56.         smove(iname, Indinfo[cnt].indname);
  57.         for (i = 0; relspecs[i].specnum != 0; i++)
  58.         {
  59.             if (rspec == relspecs[i].specnum)
  60.             {
  61.                 smove(relspecs[i].specname, Indinfo[cnt].relsp);
  62.                 break;
  63.             }
  64.         }
  65.         for (i = 0; i < 7; i++)
  66.             Indinfo[cnt].modseq[i] = -1;
  67.         if (++cnt >= 100)
  68.         {
  69.             printf("There are more indices than I can convert\n");
  70.             printf("\tso run me again to finish the rest\n");
  71.             break;
  72.         }
  73. ##    }
  74. ##    range of x is indexes
  75. ##    retrieve (pname = x.irelidp, iname = x.irelidi)
  76. ##        where x.iownerp = Usercode
  77. ##    {
  78.         for (i = 0; i < cnt; i++)
  79.         {
  80.             if (sequal(iname, Indinfo[i].indname))
  81.             {
  82.                 smove(pname, Indinfo[i].relname);
  83.                 break;
  84.             }
  85.         }
  86. ##    }
  87. ##    range of a is attribute
  88. ##    retrieve (iname = a.attrelid, aname = a.attname, aid = a.attid,
  89. ##            akey = a.attxtra)
  90. ##        where a.attowner = Usercode
  91. ##    {
  92.         for (i = 0; i < cnt; i++)
  93.         {
  94.             if (sequal(iname, Indinfo[i].indname))
  95.             {
  96.                 if (akey > 0)
  97.                     Indinfo[i].modseq[akey - 1] = aid - 1;
  98.                 smove(aname, Indinfo[i].domname[aid - 1]);
  99.                 break;
  100.             }
  101.         }
  102. ##    }
  103.  
  104.     for (i = 0; i < cnt; i++)
  105.     {
  106.         smove(Indinfo[i].indname, iname);
  107. ##        destroy iname
  108.     }
  109.     for (i = 0; i < cnt; i++)
  110.     {
  111.         kp = &keystring[0];
  112.         for (j = 0; j < 7; j++)
  113.         {
  114.             if (sequal("tidp", Indinfo[i].domname[j]))
  115.                 break;
  116.             if (j > 0)
  117.                 xmove(", ", &kp);
  118.             xmove(Indinfo[i].domname[j], &kp);
  119.         }
  120.         smove(Indinfo[i].relname, pname);
  121.         smove(Indinfo[i].indname, iname);
  122. ##        index on pname is iname (keystring)
  123.     }
  124.     for (i = 0; i < cnt; i++)
  125.     {
  126.         kp = &keystring[0];
  127.         for (j = 0; j < 7 && Indinfo[i].modseq[j] != -1; j++)
  128.         {
  129.             if (j > 0)
  130.                 xmove(", ", &kp);
  131.             xmove(Indinfo[i].domname[Indinfo[i].modseq[j]], &kp);
  132.         }
  133.         smove(Indinfo[i].indname, iname);
  134.         smove(Indinfo[i].relsp, pname);
  135.         if (j == 0)
  136.         {
  137. ##            modify iname to pname
  138.             printf("write to Bob Epstein for a free INGRES T-shirt\n");
  139.         }
  140.         else
  141.         {
  142. ##            modify iname to pname on keystring
  143.         }
  144.         printf("index %s converted.\n", iname);
  145.     }
  146.     printf("done\n");
  147. }
  148.  
  149. sequal(ax, bx)
  150. char    *ax, *bx;
  151. {
  152.     register char    *a, *b;
  153.  
  154.     a = --ax;
  155.     b = --bx;
  156.     while (*++a == *++b)
  157.         if (*a == 0)
  158.             return (1);
  159.     if (*a == 0)
  160.     {
  161.         while (*b == ' ')
  162.             b++;
  163.         if (*b)
  164.             return (0);
  165.         return (1);
  166.     }
  167.     if (*b == 0)
  168.     {
  169.         while (*a == ' ')
  170.             a++;
  171.         if (*a)
  172.             return (0);
  173.         return (1);
  174.     }
  175.     return (0);
  176. }
  177.  
  178. smove(ax, bx)
  179. char    *ax, *bx;
  180. {
  181.     register char    *a, *b;
  182.  
  183.     a = ax;
  184.     b = bx;
  185.     while (*b++ = *a++);
  186.     return (0);
  187. }
  188.  
  189. xmove(ax, bx)
  190. char    *ax, **bx;
  191. {
  192.     register char    *a, *b;
  193.  
  194.     a = ax;
  195.     b = *bx;
  196.     while (*b++ = *a++);
  197.     *bx = --b;
  198.     return (0);
  199. }
  200.